cmake_minimum_required(VERSION 3.1)
project(costmap_converter)

# Set to Release in order to speed up the program significantly
set(CMAKE_BUILD_TYPE Release) #None, Debug, Release, RelWithDebInfo, MinSizeRel
## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
        geometry_msgs
        roscpp
        std_msgs
        message_generation
        costmap_2d
        dynamic_reconfigure
        pluginlib
        cv_bridge
        )

find_package(OpenCV REQUIRED)

if (CATKIN_ENABLE_TESTING)
    find_package(rostest REQUIRED)
endif ()

## C++11 support
IF (NOT MSVC)
    include(CheckCXXCompilerFlag)
    CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
    CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
    if (COMPILER_SUPPORTS_CXX11)
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
    elseif (COMPILER_SUPPORTS_CXX0X)
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
    else ()
        message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support which is required
  by linked third party packages starting from ROS Jade. Ignore this message for ROS Indigo.")
    endif ()
endif ()

## Generate messages in the 'msg' folder
add_message_files(
        FILES
        ObstacleMsg.msg
        ObstacleArrayMsg.msg
)

## Generate added messages and services with any dependencies listed here
generate_messages(
        DEPENDENCIES
        geometry_msgs std_msgs
)

#add dynamic reconfigure api
#find_package(catkin REQUIRED dynamic_reconfigure)
generate_dynamic_reconfigure_options(
        cfg/dynamic_reconfigure/CostmapToPolygonsDBSMCCH.cfg
        cfg/dynamic_reconfigure/CostmapToPolygonsDBSConcaveHull.cfg
        cfg/dynamic_reconfigure/CostmapToLinesDBSMCCH.cfg
        cfg/dynamic_reconfigure/CostmapToLinesDBSRANSAC.cfg
        cfg/dynamic_reconfigure/CostmapToDynamicObstacles.cfg
)

catkin_package(
        INCLUDE_DIRS include
        LIBRARIES costmap_converter
        CATKIN_DEPENDS
        geometry_msgs
        pluginlib
        roscpp
        std_msgs
        message_runtime
        dynamic_reconfigure
        costmap_2d
        #DEPENDS
)

include_directories(
        include
        ${catkin_INCLUDE_DIRS}
        ${OpenCV_INCLUDE_DIRS}
)

## Declare a cpp library
add_library(costmap_converter src/costmap_to_polygons.cpp
        src/costmap_to_polygons_concave.cpp
        src/costmap_to_lines_convex_hull.cpp
        src/costmap_to_lines_ransac.cpp
        src/costmap_to_dynamic_obstacles/costmap_to_dynamic_obstacles.cpp
        src/costmap_to_dynamic_obstacles/background_subtractor.cpp
        src/costmap_to_dynamic_obstacles/blob_detector.cpp
        src/costmap_to_dynamic_obstacles/multitarget_tracker/Ctracker.cpp
        src/costmap_to_dynamic_obstacles/multitarget_tracker/Kalman.cpp
        src/costmap_to_dynamic_obstacles/multitarget_tracker/HungarianAlg.cpp
        )
target_link_libraries(costmap_converter ${catkin_LIBRARIES} ${OpenCV_LIBRARIES})
# Dynamic reconfigure: make sure configure headers raare built before any node using them
add_dependencies(costmap_converter ${PROJECT_NAME}_gencfg)
# Generate messages before compiling the lib
add_dependencies(costmap_converter ${PROJECT_NAME}_generate_messages_cpp)
## Declare a cpp executable
add_executable(standalone_converter node/costmap_converter_node.cpp)
target_link_libraries(standalone_converter ${catkin_LIBRARIES})
add_dependencies(standalone_converter costmap_converter)

# (un)set: cmake -DCVV_DEBUG_MODE=OFF ..
option(CVV_DEBUG_MODE "cvvisual-debug-mode" ON)
if (CVV_DEBUG_MODE MATCHES ON)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DCVVISUAL_DEBUGMODE")
endif ()

## Mark executables and/or libraries for installation
install(TARGETS costmap_converter
        LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
        )
install(TARGETS standalone_converter
        RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
        )

## Mark cpp header files for installation
install(DIRECTORY include/${PROJECT_NAME}/
        DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
        #FILES_MATCHING PATTERN "*.h"
        PATTERN ".svn" EXCLUDE
        )

## Mark other files for installation (e.g. launch and bag files, etc.)
install(FILES
        plugins.xml
        DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
        )

install(DIRECTORY
        cfg
        DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
        PATTERN ".svn" EXCLUDE
        )

if (CATKIN_ENABLE_TESTING)
    add_rostest_gtest(test_costmap_polygons launch/costmap_polygons.launch test/costmap_polygons.cpp)
    if (TARGET test_costmap_polygons)
        target_link_libraries(test_costmap_polygons costmap_converter)
    endif ()
endif ()
